草庐IT

Java HotSpot 枚举开销

全部标签

c++ - 枚举和枚举类的链接兼容性

假设有一个使用枚举类的C++11API://api.hppenumclassE{A,B,C};voidf(E);...//api.cppvoidf(Ee){if(e==E::A)...}现在假设我想使用这个API,但我没有C++11编译器。所以我:修改api.hpp并将枚举类更改为常规枚举。编写一些包含修改后的api.hpp并正常使用API的代码(例如调用f)。使用我的非C++11编译器编译此代码并将其链接到使用C++11编译器编译的API实现(使用未修改的api.hpp)。这似乎适用于GCC,但总体来说是否安全,或者我是在玩火(违反ODR等)?假设这两个编译器在其他方面是链接兼容的,

c++ - 有没有办法不警告 gcc 中的开关缺少 "COUNT"枚举常量?

如果带有枚举类型参数的开关缺少一些常量并且没有默认分支,则gcc-Wswitch选项会导致类似的警告warning:enumerationvalue'WHATEVER'nothandledinswitch然而,我们的许多开关是这样的:enumfoo{FOO_ONE,FOO_TWO,FOO_COUNT};其中FOO_COUNT从不作为值出现,但用于了解已定义并可能出现在变量中的值的数量。因为我们正在使用枚举值索引一个数组或对其进行位打包,并且需要检查它是否适合或其他什么。因此,处理所有值的枚举应该不包含这个常量。有没有办法保留该警告,但避免使用这种特殊值?即switch(foo){cas

c++ - 是否可以将作用域枚举 ("enum class") 上下文转换为 bool 值?

假设我有enumclassFlags:std::uint16_t{None=0,A=0x0001,B=0x0002,C=0x0004}inlineFlagsoperator|(Flagslhs,Flagsrhs){returnstatic_cast(static_cast(lhs)|static_cast(rhs));}inlineFlagsoperator&(Flagslhs,Flagsrhs){returnstatic_cast(static_cast(lhs)&static_cast(rhs));}inlineFlagsoperator|=(Flags&lhs,Flagsrhs)

c++ - OpenMP 代码远比串行慢 - 内存或线程开销瓶颈?

我正在尝试并行化(OpenMP)一些科学C++代码,其中大部分(>95%)的CPU时间花在计算N阶的讨厌(且不可避免)O(N^2)交互上~200种不同的颗粒。该计算重复1e10个时间步长。我用OpenMP尝试了各种不同的配置,每一个都比串行代码慢一些(至少一个数量级),并且随着额外的内核的添加,扩展性很差。下面是相关代码的草图,具有代表性的虚拟数据层次结构Tree->Branch->Leaf。每个Leaf对象存储自己的位置和当前和前三个时间步长的速度,等等。然后每个Branch存储一组Leaf对象,每个Tree存储一组Branch对象。这种数据结构非常适合复杂但CPU密集度较低的计算,

python - Cython 的新手......似乎无法正确包装枚举

我是Cython的新手,但我想了解更多,因为我希望能够直接从Python调用相当大且复杂的C/C++代码集。我已经能够很好地运行这些示例,甚至能够包装我正在处理的主要项目的一小部分。但是我一直坚持包装枚举。我试图在一个非常简化的示例中阐明我正在尝试的内容。这是myenum.h中的C代码//myenum.henumstrategy{slow=0,medium=1,fast=2};这是我认为可以在pymyenum.pyx中用作wapper的东西#distutils:language=ccdefexternfrom"myenum.h"namespace"myenum":cdefenumstr

C++11 元编程 - 在编译期间查找枚举值(值包含间隙)

有没有办法在编译时验证给定的值在给定枚举的值范围内,因此有效?enummyenum{val1=10,val2=30,val3=45}templateclassmyClass{...}myClassa;//fails,OKmyClassb;//compilesOKmyClassc;//compiles,NOTOK!在那里使用第二个模板非类型bool参数会很有用,该bool值的值将由元函数给出,给定的值将验证该值是否在myenum的值内。我查看了各种与枚举相关的问题,例如如何迭代枚举,但似乎无法完成。 最佳答案 enummyenum{v

c++ - unique_ptr 删除器开销

在正常的C++设计中,大多数对象都可以通过delete删除。声明,free函数,或库特定的等效于free.对于此类对象,unique_ptrDeleter实现可以是通过空基类优化消除的无状态对象。但是,某些库需要使用另一个对象(可能包含函数指针或其他上下文)从该库中删除对象。typedefstructlib_objectlib_object;structlib_api{lib_object(*createInstance)();void(*freeInstance)(lib_object*o);};可以将其包装在unique_ptr中通过存储lib_api作为自定义数据成员的指针Del

c++ - 将无效的 int 值转换为枚举

说我有enumFoo{Foo0,Foo1,Foo2};请注意,没有明确声明的Foo常量具有值3(它们是0、1和2)。以下是否会调用未定义的行为?Fooyay=(Foo)3;请特别注意3可能适合Foo的内部表示。 最佳答案 定义明确。为了表示值0、1和2,类型Foo必须至少有两个位,这也足以表示3。 关于c++-将无效的int值转换为枚举,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/question

c++ - 枚举值与枚举名称冲突

让我们采用我最近在项目中某处找到的代码构造:namespaceTest{enumEName{CoolEnum,NiceEnum};enumCoolEnum{CoolVal1,CoolVal2};enumNiceEnum{NiceVal1,NiceVal2};}我的问题是为什么编译器允许这样的事情。让我们在这里看一个代码示例:Test::CoolEnumcEnum=Test::NiceVal1;//INVALID,ascompilerreferstoTest::CoolEnumvalueofTest::Enameenum为什么允许这样的混淆?我明白为什么我必须在enum关键字前面加上,所

c++ - 循环枚举值的实现

实现具有循环值的枚举以及从一个值转换到另一个值的适当函数的最佳方法是什么?例如:enumclassDirection{NORTH,EAST,SOUTH,WEST};constexprDirectionleft(Directiond){return(Direction)((std::underlying_type::type(d)-1)%4);}但是,我觉得这样很容易出错,而且通常不可读。有没有更合适的方法来处理这种类型的枚举? 最佳答案 你总是可以这样做:enumclassDirection{NORTH,EAST,SOUTH,WES